# locust777

////---------------------------------------------------------------------------------------------------------------------------------

////5. 一些调试的实例
//
//   //ret = 第二次变成2进行计算
//#include<stdio.h>
//#include<windows.h>
//int main()
//{
//	//1+2+6 = 9
//	int n = 3;
//	//scanf("%d",&n);
//	int i = 0;
//	int ret = 1;
//	int sum = 0;
//	int j = 0;
//
//	for(j = 1;j <= n;j++)
//	{
//		for(i = 1;i <= j;i++)
//		{
//			ret *=i;  //1*1*2*3*4……n
//		}
//		sum += ret; //6+2+1
//	}
//	printf("%d\n",sum);//1 + 2 + 12
//
//
//system("pause");
//return 0;
//}

//#include<stdio.h>
//int main()
//{
//	int i = 0;
//	int arr[10] = {1,2,3,4,5,6,7,8,9,10};   //局部数据-栈区  
//	//0-9
//
//	for(i = 0;i <= 12;i++)
//	{
//		arr[i] = 0;
//		printf("hehe\n"); //输出无限个hehe
//	
//	}
//
//return 0;
//}

//栈区                                               1.栈区内存放的习惯是
//////////////////////////////////////////////////////先使用高地址处的空间
//////////////////////////////////////////////////////再使用低地址处的空间
//
//堆区                                               2.数据随着下标的增长
//////////////////////////////////////////////////////地址是由低到高变化的
//
//                                                   3.如果i和arr之间由适当的空间，
//////////////////////////////////////////////////////利用数组的越界操作就可能覆盖到i
//////////////////////////////////////////////////////就可能导致死循环
//静态区                                               
//

//《c陷阱和缺陷》



//
//
//6.1 优秀的代码

//1.运行正常
//2.bug很少
//3.效率高
//4.可读性高
//5.可维护性高
//6.注释清晰
//7.文档齐全

//常见的coding(编码方法)技巧：

//1.使用assert
//2.尽量使用const
//3.养成良好的编码风格
//4.添加必要的注释
//5.避免编码的陷阱

//
//
////6.2 示范
//
//  strcpy 拷贝
//#include<string.h>
//#include<stdio.h>
//int main()
//{
//	char arr1[20] = { 0 };
//	char arr2[] = "hello bit";
//	//strcpy在拷贝字符串的时候，会把源字符串中的\0也拷贝过去
//	strcpy(arr1,arr2);
//
//	printf("%s\n",arr1);
//
//scanf("%s\n",&arr1);
//return 0;
//}

////
//
//
//// 自定义拷贝
//
//#include<stdio.h>
//void my_strcpy(char* dest,char* src)
//{
//	while(*src != '\0')
//	{
//	*dest = *src;                      //5分的代码
//	dest++;
//	src++;
//	}
//	*dest = *src;
//
//}
//int main()
//{
//
//	char arr1[20] = "xxxxxxxxxxxxxx";
//	char arr2[] = "hello bit";
//	//strcpy在拷贝字符串的时候，会把源字符串中的\0也拷贝过去
//	my_strcpy(&arr1,&arr2);
//
//	printf("%s\n",arr1);
//
//scanf("%d\n",arr1);
//return 0;
//}
////
//
//
//
//
//#include<assert.h>
//#include<stdio.h>
//#include<windows.h>
//void my_strcpy(char* dest,const char* src)
//{
//	//断言
//	assert(src != NULL); // ? //使用assert.h头文件
//	assert(dest != NULL);
//
//	while(*dest++ = *src++)  //地址交换，再都相加交换
//	{
//		;
//	}
//}
//int main()
//{
//
//	char arr1[20] = "xxxxxxxxxxxxxx";
//	char arr2[] = "hello bit";
//	//strcpy在拷贝字符串的时候，会把源字符串中的\0也拷贝过去
//	my_strcpy(arr1,arr2);
//
//	printf("%s\n",arr1);
//
//system("pause");
//return 0;
//}


//
//#include<stdio.h>
//int main()
//{
//	//int num = 0;
//	//num = 20;
//	//printf("%d\n",num);
//
//	const int num = 0;
//	//num = 20;// const 决定的值无法被修改
//
//	printf("%d\n",num);
//
//
//return 0;
//}


//#include<stdio.h>
//int main()
//{
//	//int num = 0;
//	//num = 20;
//	//printf("%d\n",num);
//
//	const int num = 0;
//	//num = 20;
//	int*p = &num; //const的数据，可以用指针传地址，利用地址改
//	*p = 20;
//
//	printf("%d\n",num);
//
//
//return 0;
//}


//
//#include<stdio.h>
//int main()
//{
//	//int num = 0;
//	//num = 20;
//	//printf("%d\n",num);
//
//	const int num = 0;
//	//num = 20;
//	//const 修饰指针变量
//	//1. counst 放在 * 的左边
//	//意思是：p指向的对象不能通过p来改变了,但是p变量本身的值可以是可以改变的
//	//2.const 放在 * 的右边
//	//意思是：p指向的对象是可以通过p来改变，但是不能修改p变量本身的值
//	//
//	////*p = 20； //err
//	const int*p = &num; //const的数据，可以用指针传地址，利用地址改
//	//意思
//	*p = 0;                               //加深理解
//	int n = 100;
//	p = &n;
//	
//	//int n  = 100; 
//
//	//int contst* p;
//
//	//*p = 20;err
//	//p = &n;err
//
//	printf("%d\n",num);
//
//scanf("%d",&num);
//return 0;
//}








//                   const 修饰指针变量
	//const* p = &arr; 
	//1. const 放在 * 的左边
	//意思是：p指向的对象不能通过p来改变了,但是p变量本身的值可以是可以改变的
	
	//*const p = &arr;
    //2.const 放在 * 的右边
	//意思是：p指向的对象是可以通过p来改变，但是不能修改p变量本身的值



//int m = 10;
//int n = 100;

//		const 
//女孩         int* p = &m;              int * const p = &n;

//      *p = 0;   no                     *p = 0;   yse
//      p  = &n;  yse                    p = &n;   no

//                 const int* const p = &m;
//                      
//                       *p = 0;  no
//                       p = &n;  no
